#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<sys/types.h>
#include	<sys/stat.h>
#include	<fcntl.h>
#include	<time.h>
#include	<unistd.h>
#include	"read2ch.h"

#define	CGINAME	"read.cgi"
#define	CGIVER	"read.cgi ver11 (2001/8/26)"
#define	RES_YELLOW	 900
#define	RES_REDZONE	 950
#define	RES_RED		1000
#define	RES_IMODE	10
#define	RES_NORMAL	100
#define	MAX_FILESIZE	(8192 * 64)
#define	SIZE_BUF	0xa000

#define	LIMIT_PM	23
#define	LIMIT_AM	 3

char	*zz_remote_addr		;
char	*zz_remote_host		;
char	*zz_http_referer	;
char	*zz_http_cookie		;
char	*zz_query_string	;
char	*zz_temp		;
char	*zz_http_user_agent	;
char	*zz_http_language	;
#ifdef GZIP
char	*zz_http_encoding	;
int	 gzip_flag;
#endif

#ifdef LASTMOD
char	*zz_http_if_modified_since	;
time_t  zz_fileLastmod;
char    lastmod_str[1024];
#endif

char	zz_bs[1024]		;
char	zz_ky[1024]		;
char	zz_ls[1024]		;
char	zz_st[1024]		;
char	zz_to[1024]		;
char	zz_nf[1024]		;
char	zz_im[1024]		;
int	nn_st,nn_to,nn_ls	;
char	*BigBuffer = NULL	;
char	*BigLine[RES_RED+16]	;

char	*KARA	= ""		;
int	zz_fileSize = 0		;
int	lineMax = -1		;
int	out_resN = 0		;

time_t		t_now		;
struct	tm	*tm_now		;
long		currentTime	;

char	*LastChar(char *src,char *c)		;
char	*findSplitter(char *stt,int sp)		;
char	*zz_GetString(char *dst,char *tgt)	;
char	*doReplace(char *des,char *str0,char *str1);

/****************************************************************/
/*	BadAccess							*/
/****************************************************************/
int	BadAccess()
{
	if(strstr(zz_http_user_agent,"DreamPassport"))	return 0;
	if(strstr(zz_http_user_agent,"DoCoMo"))		return 0;
	if(strstr(zz_http_user_agent,"J-PHONE"))	return 0;
	if(strstr(zz_http_user_agent,"ASTEL"))		return 0;
	if(strstr(zz_http_user_agent,"[ja]"))		return 0;
	if(strstr(zz_http_user_agent,"iCab"))		return 0;	/* MAC		*/
	if(strstr(zz_http_user_agent,"iBOX"))		return 0;	/* MAC		*/
	if(strstr(zz_http_user_agent,"WannaBe"))	return 0;	/* MAC		*/
	if(strstr(zz_http_user_agent,"Macintosh; I;"))	return 0;	/* MAC		*/

	if(strstr(zz_http_user_agent,"Mozilla/3.0N"))	return 0;	/* small?	*/
	if(strstr(zz_http_user_agent,"CBBoard"))	return 0;	/* small?	*/
	if(strstr(zz_http_user_agent,"PersonaWare"))	return 0;	/* small?	*/
	if(strstr(zz_http_user_agent,"Sharp"))		return 0;	/* small?	*/

	if(strstr(zz_http_user_agent,"95"))		return 0;	/* win95	*/
	if(strstr(zz_http_user_agent,"NT 4.0"))		return 0;	/* winNT	*/
	if(strstr(zz_http_user_agent,"WinNT"))		return 0;	/* winNT	*/

	if(!*zz_http_user_agent && !*zz_http_language)	return 1;
/*	if(!*zz_http_user_agent)			return 1;*/
#ifdef	Katjusha_Beta_kisei
	if(strstr(zz_http_user_agent,"Katjusha"))	return 1;
#endif
	if(strstr(zz_http_user_agent,"WebFetch"))	return 1;
	if(strstr(zz_http_user_agent,"origin"))		return 1;
	if(strstr(zz_http_user_agent,"Nozilla"))	return 1;
	if(strstr(zz_http_user_agent,"WWWD"))		return 1;

/*	if(!*zz_http_language)				return 1;*/

	return	0;
}
/****************************************************************/
/*	Log Out							*/
/****************************************************************/
int	logOut(char *txt)
{
	FILE	*fp			;

#ifdef DEBUG
return 1;
#endif

	if(!BadAccess())	return 1;

#ifdef	LOGLOGOUT
/*
if(strcmp(zz_bs,"ascii"))	return 1;
*/
	fp = fopen("./logout.txt","a+")	;
	if(fp == NULL)	return		;
	fprintf(fp,"%02d:%02d:%02d %8s:",tm_now->tm_hour,tm_now->tm_min,tm_now->tm_sec,zz_bs)	;
	fprintf(fp,"(%15s)",zz_remote_addr)	;
	fprintf(fp,"%s***%s\n",zz_http_language,zz_http_user_agent)	;

/*
	fprintf(fp,"%s\n",zz_query_string)	;
	if(strstr(zz_http_user_agent,"compatible"))
	fprintf(fp,"%s\n",zz_http_language)	;
	else
	fprintf(fp,"%s***%s\n",zz_http_language,zz_http_user_agent)	;
	if(*zz_http_referer)	fprintf(fp,"%s\n",zz_http_referer)	;
	else			fprintf(fp,"%s***%s\n",zz_http_language,zz_http_user_agent)	;
	else			fprintf(fp,"%s\n",zz_http_user_agent)	;
*/

	fclose(fp)				;
#endif
	html_error("なんか不調です。")		;
	return	1				;
}
/****************************************************************/
/*	HTML BANNER						*/
/****************************************************************/
int	html_bannerNew()
{
printf("<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=1 WIDTH=100%%><TR><TD>\n")	;
/**/
printf("<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%%>\n")	;
printf("<TR><TD HEIGHT=1 BGCOLOR=#eeeeee><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>\n")	;
printf("<TR BGCOLOR=#cccccc><TD HEIGHT=20 NOWRAP><FONT SIZE=2>&nbsp;\n")	;
printf("| <A HREF=\"http://www.maido3.com/\" CLASS=\"BigLine\"> おすすめ </A>\n")	;
printf("| <A HREF=\"http://news.kakiko.com/2chwatch/\" CLASS=\"BigLine\"> 2chサーバ監視所 </A>\n")	;
printf("| <A HREF=\"http://www.binboserver.com/\" CLASS=\"BigLine\"> BinboServer </A>\n")	;
printf("| <A HREF=\"http://www.maido3.com/server/subdomain.html\" CLASS=\"BigLine\"> Hikky.Zansu.com </A>\n")	;
printf("| <A HREF=\"http://news.kakiko.com/\" CLASS=\"BigLine\"> 無料サービス </A>\n")	;
printf("|</FONT></TD></TR>\n")	;
printf("<TR><TD HEIGHT=1 BGCOLOR=#333333><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>\n")	;
printf("<TR><TD HEIGHT=1 BGCOLOR=#eeeeee><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>\n")	;
printf("<TR><TD HEIGHT=1 BGCOLOR=#333333><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>\n")	;
printf("</TABLE>\n")	;
/**/

printf("<CENTER>\n")	;

printf("<BR>\n")				;
printf("さぶドメインシリーズ登場<BR>\n")	;
printf("   *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>syo-ten</FONT></B>.com<BR>\n")		;
printf("   *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>gasuki</FONT></B>.com<BR>\n")		;
printf("   *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>zansu</FONT></B>.com<BR>\n")		;
printf("おすきな名前を無料で使えます。早い者勝ち。<BR>\n")		;
printf("<FONT COLOR=DEEPPINK><B>工夫しだいで、楽しさ100倍。</B></FONT>\n")		;

printf("<P><A HREF=\"http://www.maido3.com/server/\">")		;
printf("深夜でも快適なレンタルサーバサービス(n)")		;
printf("</A>\n")					;
printf("<BR>あの巨大なサイトも使っています。\n")	;

printf("</CENTER><P>\n")	;
printf("</TD></TR></TABLE><P>\n")	;

}

#ifdef	CM_BBSPINK
/****************************************************************/
/*	HTML BANNER						*/
/****************************************************************/
int	html_banner()
{
printf("<CENTER>\n")	;
printf("<A TARGET=\"_blank\" HREF=\"http://www.pinknavi.com/?pinkid=PB0001&prg=3&act=0&txt=おいでませ&url=http://www.seiai.com/\">おいでませアダルトサイト</A><br>\n")	;
printf("<br><a href=\"http://www.maido3.com/mentai/\"><b><font size=4>深夜でも快適なレンタルサーバサービス</font></b></a><br>\n")	;
printf("</CENTER>\n")	;
printf("<P>\n")	;

}
#else
/****************************************************************/
/*	HTML BANNER						*/
/****************************************************************/
int	html_banner()
{
printf("<CENTER>\n")	;

printf("<A HREF=\"http://www.maido3.com/server/\" TARGET=\"_blank\">")		;
printf("深夜でも快適なレンタルサーバサービス")		;
printf("</A>\n")					;
printf("<BR>あの巨大なサイトも使っています。\n")	;

printf("</CENTER><P>\n")	;

}
#endif
/****************************************************************/
/*	Get file size						*/
/****************************************************************/
int	out_html1()
{
	char	*s[20]		;
	char	r0[SIZE_BUF],r1[SIZE_BUF],r2[SIZE_BUF],r3[SIZE_BUF],r4[SIZE_BUF]	;
	char	p[SIZE_BUF]			;

	if(out_resN)	return 0	;
	strncpy(p,BigLine[0],1024)		;
	p[1024 -1] = '\0'; 
	if(!*p)	return	1		;
	res_split(s,p)			;
#ifdef	TYPE_TERI
	/*someReplace(s[4],r4,"@`",",")	;*/
	html_head(s[4],lineMax)		;
#else
	someReplace(s[4],r4,"@`",",")	;
	html_head(r4,lineMax)		;
#endif
if(strcmp(zz_im,"true"))	/* no imode	*/
{
	printf("<DL>")		;
}
	out_resN ++			;
	return	0			;
}
int	out_html(int line,int lineNo)
{
	char	*s[20]		;
#ifdef	TYPE_TERI
	char	*r0,*r1,*r2,*r3,*r4	;
#else
	char	r0[SIZE_BUF],r1[SIZE_BUF],r2[SIZE_BUF],r3[SIZE_BUF],r4[SIZE_BUF]	;
#endif
	char	p[SIZE_BUF]			;

/*printf("line=%d[%s]<P>\n",line,BigLine[line]);return 0;*/

	if(!out_resN)				/* Can I write header ?	*/
	{
		strncpy(p,BigLine[0],1024)		;
		p[1024 -1] = '\0'; 
		if(!*p)	return	1		;
		res_split(s,p)			;
#ifdef	TYPE_TERI
	r4 = s[4]			;
#else
	someReplace(s[4],r4,"@`",",")	;
#endif
		html_head(r4,lineMax)		;
if(strcmp(zz_im,"true"))	/* no imode	*/
{
		printf("<DL>")		;
}
	}
	out_resN ++				;

	strncpy(p,BigLine[line],1024)			;
	p[1024 -1] = '\0'; 
	if(!*p)	return	1	;
	res_split(s,p)		;

#ifdef	TYPE_TERI
		r0 = s[0]			;
		r1 = s[1]			;
		r3 = s[3]			;
#else
		someReplace(s[0],r0,"@`" , ",")	;
		someReplace(s[1],r1,"@`" , ",")	;
		someReplace(s[3],r3,"@`" , ",")	;
		someReplace(r3,r3,"&amp;" , "&")		;
#endif
		hlinkReplace(r3)			;

	    if(strcmp(zz_im,"true"))		 /* no imode */
	    {
		if(*r3 && strlen(r3) < 8192)
		{
		printf("<dt>")		;
		printf("%d",lineNo)	;
		printf(" 名前:")	;

		if(*r1)	{printf("<a href=\"mailto:%s \">",r1)	;}
		else	{printf("<font color=green>")	;}

		printf("<b>%s </b>",r0)	;

		if(*r1)	{printf("</a>")		;}
		else	{printf("</font>")	;}

		printf(" 投稿日:%s",s[2])	;
		printf("<dd>")			;
		printf("%s",r3)			;
		printf("<br><br>")		;
		}
		else
		{
		printf("<dt>")		;
		printf("%d",lineNo)	;
		printf(" 名前:<font color=green><b>");
		printf("%s","")					;
		printf("</b></font>")				;
		printf(" 投稿日:[ここ壊れています]")		;
		printf("<DD>")					;
		printf("[ここ壊れています]")			;
		printf("<br><br>")				;
		}
if(IsBusy2ch() && out_resN > RES_NORMAL)
{
printf(" <a href=\"./%s?bbs=%s&key=%s&st=%d&to=%d\">次の %d レスを見る</a>\n",
CGINAME,zz_bs,zz_ky,lineNo,lineNo+RES_NORMAL,RES_NORMAL)	;
printf(" <a href=\"./%s?bbs=%s&key=%s&ls=%d\">最新レス %d</a>\n",
CGINAME,zz_bs,zz_ky,RES_NORMAL,RES_NORMAL)	;
printf(" (%02d:00PM - %02d:00AM の間一気に全部は読めません)<BR>\n",LIMIT_PM-12,LIMIT_AM)	;
	return 1	;
}
	    }
	    else			/* imode	*/
	    {
		if(*r3)
		{
		printf("<p>[%d:",lineNo)	;
		if(*s[1])	{printf("<a href=\"mailto:%s \">",r1)	;}
		printf("<b>%s </b>",r0)	;
		if(*s[1])	{printf("</a>")	;}
		printf("(%s)]",s[2])		;
		printf("<br>%s</p>",r3)		;
		printf("<hr>\n")		;
		}
		else
		{
		printf("<p>[%d:",lineNo)		;
		printf("ここ壊れています]</p>")	;
		printf("<hr>\n")		;
		}
if(out_resN > RES_IMODE)
{
printf(" <a href=\"./%s?bbs=%s&key=%s&st=%d&to=%d&imode=true\">次の %d レスを見る</a>\n",
CGINAME,zz_bs,zz_ky,lineNo,lineNo+RES_IMODE,RES_IMODE)	;
printf(" <a href=\"./%s?bbs=%s&key=%s&ls=%d&imode=true\">最新レス %d</a><BR>\n",
CGINAME,zz_bs,zz_ky,RES_IMODE,RES_IMODE)	;
	return 1	;
}
	    }

	return	0				;
}
/****************************************************************/
/*	Get file size						*/
/****************************************************************/
int	dat_out()
{
	int	line,lineNo			;

	for(line=0;line<lineMax;line++)
	{
		lineNo = line + 1	;

		if(lineNo == 1)
		{
			if(!strcmp(zz_nf,"true"))	continue	;
		}
		else
		{
			if(nn_st && lineNo < nn_st)	continue	;
			if(nn_to && lineNo > nn_to)	continue	;
			if(nn_ls && line < lineMax - nn_ls)	continue	;
		}

		if(out_html(line,lineNo))	break	;
	}
	out_html1()	;
	html_foot(lineMax)	;

return	0	;
}
/****************************************************************/
/*	Get file size						*/
/****************************************************************/
int	dat_read()
{
	int	i				;
	FILE	*fp				;
	char	fname[1024]			;


	sprintf(fname,"../%.256s/dat/%.256s.dat",zz_bs,zz_ky); 
	//sprintf(fname,"../%s/dat/%s.dat",zz_bs,zz_ky)	;
#ifdef DEBUG
	sprintf(fname,"998695422.dat")	;
#endif
	zz_fileSize    = getFileSize(fname)	;

	if(zz_fileSize > MAX_FILESIZE)
		html_error("このスレッド大きすぎます。")	;
	if(*zz_ky == '.')
		html_error("そんな板orスレッドないです。")	;


	nn_st = atoi(zz_st)		;
	nn_to = atoi(zz_to)		;
	nn_ls = atoi(zz_ls)		;
	if(nn_st < 0)	nn_st = 0	;
	if(nn_to < 0)	nn_to = 0	;
	if(nn_st == 1 && nn_to ==1)	strcpy(zz_nf,KARA)	;
	if(!strcmp(zz_im,"true"))	 /* imode */
	{
		if(!nn_st && !nn_to && !nn_ls)	nn_ls = RES_IMODE	;
	}
	if(strcmp(zz_nf,"true"))	nn_ls --	;
	if(nn_ls < 0)	nn_ls = 0	;

	BigBuffer = malloc(zz_fileSize + 32)		;
	if(!BigBuffer)	html_error("メモリの確保に失敗しました。")	;

	fp = fopen(fname,"r")	;
	if(!fp)
	{
		html_error("そんな板orスレッドないです。")	;
		return	0	;
	}
	fread(BigBuffer,zz_fileSize,1,fp)	;
	fclose(fp)				;
	BigBuffer[zz_fileSize] = '\0'		;
	for(i=0;i<zz_fileSize;i++)
	{
		if(BigBuffer[i] == '\0')	BigBuffer[i] = '*'	;
	}

	lineMax = getLineMax()			;
/*
html_error("調整中。。。")	;
*/
	return 0;
}
/****************************************************************/
/*	Get line number						*/
/****************************************************************/
int	getLineMax()
{
	int	line = 0	;
	char	*p = BigBuffer	;
	char	*p1		;
	char	b[SIZE_BUF]	;

	if(!p)	return -8	;

	while(p1 = strchr(p,'\n'))
	{
		BigLine[line] = p	;
		*p1 = '\0'	;
		p = p1		;
		if(line > RES_RED)	break	;
		line ++		;
		p++		;
	}
	return line		;
}
/****************************************************************/
/*	Get file size						*/
/****************************************************************/
int	getFileSize(char *file)
{
	struct	stat	CountStat		;
	int	ccc = 0				;
	if(!stat(file,&CountStat))	ccc = (int)CountStat.st_size;
	return	ccc				;
}

/****************************************************************/
/*	Get file last-modified						*/
/****************************************************************/

#ifdef LASTMOD
time_t getFileLastmod(char *file)
{
	struct	stat	CountStat		;
#ifdef FreeBSD
       struct  timespec        ccc;
       if(!stat(file,&CountStat))      ccc = CountStat.st_mtimespec;
       return  ccc.tv_sec;
#else
       time_t  ccc;
       if(!stat(file,&CountStat))      ccc = CountStat.st_mtime;
       return  ccc;
#endif
}

int get_lastmod_str(time_t lastmod){
	strftime(lastmod_str, 1024, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&lastmod));
	return(1);
}
#endif

/****************************************************************/
/*	GET Env							*/
/****************************************************************/
int	zz_GetEnv(void)
{
	currentTime = (long)time(&t_now);
	time(&t_now)			;
	t_now +=  9*60*60		;
	tm_now = gmtime(&t_now)		;

	zz_remote_addr		= getenv("REMOTE_ADDR")		;
	zz_remote_host		= getenv("REMOTE_HOST")		;
	zz_http_referer		= getenv("HTTP_REFERER")	;
	zz_http_cookie		= getenv("HTTP_COOKIE")		;
	zz_query_string		= getenv("QUERY_STRING")	;
	zz_temp			= getenv("REMOTE_USER")		;
	zz_http_user_agent	= getenv("HTTP_USER_AGENT")	;
	zz_http_language	= getenv("HTTP_ACCEPT_LANGUAGE");
#ifdef GZIP
	zz_http_encoding	= getenv("HTTP_ACCEPT_ENCODING");
#endif
#ifdef LASTMOD
	zz_http_if_modified_since	= getenv("HTTP_IF_MODIFIED_SINCE");
#endif

	if(!zz_remote_addr)	zz_remote_addr    = KARA	;
	if(!zz_remote_host)	zz_remote_host    = KARA	;
	if(!zz_http_referer)	zz_http_referer   = KARA	;
	if(!zz_query_string)	zz_query_string   = KARA	;
	if(!zz_temp)		zz_temp		  = KARA	;
	if(!zz_http_user_agent)	zz_http_user_agent= KARA	;
	if(!zz_http_language)	zz_http_language  = KARA	;

	zz_GetString(zz_bs ,"bbs")		;
	zz_GetString(zz_ky ,"key")		;
	zz_GetString(zz_ls ,"ls")		;
	zz_GetString(zz_st ,"st")		;
	zz_GetString(zz_to ,"to")		;
	zz_GetString(zz_nf ,"nofirst")		;
	zz_GetString(zz_im ,"imode")		;
}
/****************************************************************/
/*	MAIN							*/
/****************************************************************/
main()
{
#ifdef GZIP
	int pid;
    int pipefds[2];
	int whitespace = 2048;
#endif
	char	fname[1024]			;
	zz_GetEnv()				;

	printf("Content-type: text/html\n")	;
#ifdef LASTMOD
	sprintf(fname,"../%.256s/dat/%.256s.dat",zz_bs,zz_ky); 
#ifdef DEBUG
	sprintf(fname,"998695422.dat")	;
#endif
	zz_fileLastmod = getFileLastmod(fname)	;
	get_lastmod_str(zz_fileLastmod);
	if(zz_http_if_modified_since && strstr(zz_http_if_modified_since, lastmod_str)){
		printf("Status: 304\n")	;
		printf("\n")	;
		return(0);
	}
#endif
	
#ifdef GZIP
	if(zz_http_encoding && strstr(zz_http_encoding,"gzip")){
		gzip_flag = 1;
	}else{
		gzip_flag = 0;
	}
	if(gzip_flag){
		printf("Content-Encoding: gzip\n");
	}
#endif


#ifdef DEBUG
	sprintf(fname,"998695422.dat")	;
#endif
	zz_fileSize    = getFileSize(fname)	;

// Get Last-Modified Date
#ifdef LASTMOD
	printf("Last-Modified: %.256s\n", lastmod_str);
#endif

	printf("\n")				;
#ifdef DEBUG
	sleep(1);
#endif
	fflush(stdout);

#ifdef GZIP
    if(gzip_flag) {
        pipe(pipefds);
        if((pid=fork()) == 0){
            //child 
            dup2(pipefds[0], 0);
            close(pipefds[0]);
            close(pipefds[1]);
            execl("/bin/gzip", "gzip", "-cf", NULL);
			printf ("Error can't exec\n");
			exit(1);
        }
		//parent
		dup2(pipefds[1], 1);
		close(pipefds[0]);
		close(pipefds[1]);
		//put 2048byte
		fflush(stdout);
		while(whitespace--)putchar(' ');
		fflush(stdout);
    }

#endif

	logOut("")				;

	dat_read()				;
	dat_out()				;

	if(BigBuffer)	free(BigBuffer)		;
	BigBuffer = NULL			;

#ifdef GZIP
	if(gzip_flag) {
		fflush(stdout);
		close(1);
		waitpid(pid, NULL, 0);
	} 
#endif

}
/****************************************************************/
/*	ERROR END						*/
/****************************************************************/
int	html_error(char *mes)
{
	char	zz_soko[256]	;
	char	tmp[256]	;
	char	doko[256]	;
	struct	stat	CountStat		;
	char	comcom[256]	;

	*tmp = '\0'	;
	strcpy(tmp,LastChar(zz_ky,"/"))	;
	strncpy(zz_soko,tmp,3)	;

	*comcom = '\0'		;
if(strstr(mes,"不調"))
{
sprintf(comcom,"<A HREF=\"http://green.jbbs.net/computer/20/bigserver.html\">お問い合わせ先</A>");
}


printf("<HTML><HEAD>")	;
printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">")	;
printf("<TITLE>%s</TITLE>",mes)	;
printf("<style type=\"text/css\">\n")	;
printf("<!--\n")	;
printf("TD.Type1 {\n")	;
printf("color: #ffffff;\n")	;
printf("text-align: left;\n")	;
printf("}\n")	;
printf("A.BigLine {\n")	;
printf("color: #000000;\n")	;
printf("text-decoration: none;\n")	;
printf("}\n")	;
printf("-->\n")	;
printf("</style>\n")	;
printf("</HEAD>\n")	;
/*printf("<BASE TARGET=\"_blank\">\n")	;*/

printf("<BODY TEXT=\"#000000\" BGCOLOR=\"#EFEFEF\" link=\"#0000FF\" alink=\"#FF0000\" vlink=\"#660099\">\n")	;

printf("<P><FONT SIZE=+1 COLOR=\"#FF0000\">%s</FONT></B><BR>\n",mes)	;
printf("<DL>")	;
printf("<dt>1 名前:<font color=green><b>%s</b></font>投稿日:2001/04/12(木) 15:11<dd>%s<br><br>%s<br>\n",CGIVER,mes,comcom)	;

if(strstr(zz_http_user_agent,"Katjusha"))
{
printf("<dt>2 名前:<font color=green><b>%s</b></font>投稿日:2001/04/12(木) 15:11<dd>",CGIVER)	;
/*printf("%s",zz_http_user_agent)	;*/
printf("<BR>")				;
printf("<P><A target=\"_blank\" HREF=\"http://www.maido3.com/server/\">")		;
printf("http://www.maido3.com/server/")		;
printf("</A><BR>")					;
printf("さぶドメインシリーズ登場<BR>")	;
printf("   *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>syo-ten</FONT></B>.com<BR>")		;
printf("   *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>gasuki</FONT></B>.com<BR>")		;
printf("   *****.<B><FONT SIZE=+1 FACE=\"Arial\" COLOR=DEEPPINK>zansu</FONT></B>.com<BR>")		;
printf("おすきな名前を無料で使えます。早い者勝ち。<BR>")		;
printf("<FONT COLOR=DEEPPINK><B>工夫しだいで、楽しさ100倍。</B></FONT>")		;

printf("<P><A target=\"_blank\" HREF=\"http://www.maido3.com/server/\">")		;
printf("深夜でも快適なレンタルサーバサービス")		;
printf("</A>")					;
printf("<BR>あの巨大なサイトも使っています。<BR><BR>")	;
printf("<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%%>")	;
printf("<TR><TD HEIGHT=1 BGCOLOR=#eeeeee><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>")	;
printf("<TR BGCOLOR=#cccccc><TD HEIGHT=20 NOWRAP><FONT SIZE=2>&nbsp;")	;
printf("| <A target=\"_blank\" HREF=\"http://www.maido3.com/\" CLASS=\"BigLine\"> おすすめ </A>")	;
printf("| <A target=\"_blank\" HREF=\"http://news.kakiko.com/2chwatch/\" CLASS=\"BigLine\"> 2chサーバ監視所 </A>")	;
printf("| <A target=\"_blank\" HREF=\"http://www.binboserver.com/\" CLASS=\"BigLine\"> BinboServer </A>")	;
printf("| <A target=\"_blank\" HREF=\"http://www.maido3.com/server/subdomain.html\" CLASS=\"BigLine\"> Hikky.Zansu.com </A>")	;
printf("| <A target=\"_blank\" HREF=\"http://news.kakiko.com/\" CLASS=\"BigLine\"> 無料サービス </A>")	;
printf("|</FONT></TD></TR>")	;
printf("<TR><TD HEIGHT=1 BGCOLOR=#333333><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>")	;
printf("<TR><TD HEIGHT=1 BGCOLOR=#eeeeee><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>")	;
printf("<TR><TD HEIGHT=1 BGCOLOR=#333333><IMG HEIGHT=1 WIDTH=1 SRC=\"/space1.gif\"></TD></TR>")	;
printf("</TABLE>")	;
printf("<br><br>\n")	;
}
printf("</DL>\n")	;

printf("<CENTER>\n")	;
printf("<BR>\n")	;
html_bannerNew()	;
printf("<BR>\n")	;

printf("</CENTER><HR>\n")		;
printf("<FONT SIZE=-2>%s</FONT><HR><P>\n",CGIVER)	;

if(strstr(mes,"そんな"))
{
	sprintf(doko,"../%.50/kako/%.50/%.50.html",zz_bs,zz_soko,tmp)	;
	if(!stat(doko,&CountStat))
	{
		printf("隊長! 過去ログ倉庫で、<A HREF=\"/%s/kako/%s/%s.html\">スレッド %s.html</A> を発見しました。\n",zz_bs,zz_soko,tmp,tmp);
	}
	else
	{
		sprintf(doko,"../%.50s/kako/%.50s/%.50s.dat",zz_bs,zz_soko,tmp)	;
		if(!stat(doko,&CountStat))
		{
		printf("隊長! 過去ログ倉庫で、<A HREF=\"/%s/kako/%s/%s.dat\">スレッド %s.dat</A> を発見しました。<BR><B><FONT SIZE=+1 COLOR=RED>が</FONT></B>、しかしまだ html化されていません。残念、待つしかない。\n",zz_bs,zz_soko,tmp,tmp);
		}
		else
		{
		printf("<A HREF=\"/%s/kako/\">過去ログ倉庫</A>にもありませんでした。<BR>問い合わせても見つかる可能\性はほとんどありません。\n",zz_bs);
		}
	}
}

printf("</BODY>\n")	;
printf("</HTML>\n")	;

if(BigBuffer)	free(BigBuffer)	;
BigBuffer = NULL			;

exit(0)	;
}
int	html_error999(char *mes)
{
	char	zz_soko[256]	;
	char	tmp[256]	;
	*tmp = '\0'	;
	strcpy(tmp,LastChar(zz_ky,"/"))	;
	strncpy(zz_soko,tmp,3)	;

printf("<HTML><HEAD>")	;
printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">")	;
printf("<TITLE>ERROR</TITLE>")	;
printf("</HEAD>\n")	;

printf("<BODY TEXT=\"#000000\" BGCOLOR=\"#EFEFEF\" link=\"#0000FF\" alink=\"#FF0000\" vlink=\"#660099\">\n")	;

printf("\n")		;
printf("<TABLE border=1 cellspacing=11 cellpadding=2 width=95% bgcolor=\"#EFEFEF\" align=center><TR><TD>\n");
printf("えらー、%s<P>\n",mes)		;
printf("bbs = [%s] \n",zz_bs)	;
printf("key = [%s] \n",zz_ky)	;
printf("ls = [%s] \n",zz_ls)		;
printf("st = [%s] \n",zz_st)		;
printf("to = [%s] \n",zz_to)		;
printf("nofirst = [%s]<BR>\n",zz_nf)	;
printf("fileSize = [%d bytes] %dlines<BR>\n",zz_fileSize,lineMax)	;
printf("time=[%02d:%02d:%02d]<BR>\n",tm_now->tm_hour,tm_now->tm_min,tm_now->tm_sec);

printf("<BR>「えらー、そんな板orスレッドないです」の場合はここ倉庫へ Go <BR>")	;
printf("<A HREF=\"/%s/kako/%s/%s.html\">過去ログ倉庫 %s.html</A>\n",zz_bs,zz_soko,tmp,tmp);
printf("<BR>まだ、dat -> html 変換が行われていない場合が良くあります。\n");
printf("<BR><A HREF=\"http://teri.2ch.net/test/read.cgi?bbs=accuse&key=980507715&ls=30\">ここ</A>で訴えると、過去ログ整理をしてくれる場合があるかもです。\n");


printf("</TD></TR></TABLE>\n")		;

printf("<BR><BR><BR>\n")		;
html_banner()	;
printf("<BR><BR><BR>\n")		;

printf("<FONT SIZE=-2>%s</FONT>\n",CGIVER)	;
printf("</BODY>\n")	;
printf("</HTML>\n")	;

if(BigBuffer)	free(BigBuffer)	;
BigBuffer = NULL			;

exit(0)	;
}
/****************************************************************/
/*								*/
/****************************************************************/
char	*zz_GetString(char *dst,char *tgt)
{
	int	i			;
	int	ch = (int)'&'		;
	char	*kk0			;
	char	*kk1			;
	char	*kk = zz_query_string	;
	for(i=0;i<200;i++)
	{
		if(!strncmp(kk,tgt,strlen(tgt)))
		{
			kk0 = kk			;
			kk1 = strchr(kk,ch)		;
			if(kk1)	*kk1 = '\0'			;
			strncpy(dst,kk0 + strlen(tgt) + 1,1024) ;
			dst[1024 -1] = '\0';
			if(kk1)	*kk1 = ch			;
			return	dst				;
		}
		kk = strchr(kk,ch)				;
		if(!kk)		break				;
		kk ++						;
	}
	*dst = '\0'	;
	return	dst	;
}
int whatKanji(unsigned char *str)
{
    int val = 0;
    unsigned char b1, b2, b3;

    b1 = *str++;
    b2 = *str++;
    b3 = *str;
    if (b1 == 0x1b) {
        if (b2 == '$' && b3 == 'B') return 16;
        if (b2 == '$' && b3 == '@') return 32;
        if (b2 == '(' && b3 == 'J') return 64;
        if (b2 == '(' && b3 == 'B') return 128;
        return 0;
    }
    if ( b1 >= 0xa0 && b1 <= 0xdf) val |= 1;
    if ((b1 >= 0x81 && b1 <= 0x9f ||
         b1 >= 0xe0 && b1 <= 0xfc) && 
        (b2 >= 0x40 && b2 <= 0xfc && b2 != 0x7f)) val |= 2;
    if (b1 == 0x8e && (b2 >= 0xa0 && b2 <= 0xdf)) val |= 4; 
    if ((b1 >= 0xa1 && b1 <= 0xfe) &&
        (b2 >= 0xa1 && b1 <= 0xfe)) val |= 8;

    return val;
}
#ifdef	TYPE_TERI
char	*findSplitter(char *stt,int sp)
{
	unsigned char	*p = (unsigned char*)stt	;
	char	ss = (unsigned char)(sp & 0x00ff)		;

	while(*p)
	{
/*
		if( *p >= 0xa0 && *p <= 0xdf)	{p++	;continue;}
		if((*p >= 0x81 && *p <= 0x9f || *p >= 0xe0 && *p <= 0xfc))	{p += 2	;continue;}
*/
		if(*p == ss && *(p+1) == '>')		return	p	;
		p++				;
	}
	return	NULL		;
}
#else
char	*findSplitter(char *stt,int sp)
{
	unsigned char	*p = (unsigned char*)stt	;
	char	ss = (unsigned char)(sp & 0x00ff)		;

	while(*p)
	{
		if( *p >= 0xa0 && *p <= 0xdf)	{p++	;continue;}
		if((*p >= 0x81 && *p <= 0x9f || *p >= 0xe0 && *p <= 0xfc))	{p += 2	;continue;}
/*		if((*p >= 0x40 && *p <= 0xfc && *p != 0x7f))	p += 2	;*/
		if(*p == ss)	return	p	;
		p++				;
	}
	return	NULL		;
}
#endif
int	res_split(char **s,char *p)
{
	int	i	;
	char	*p0	;

	for(i=0;i<5;i++) s[i] = KARA	;

	s[0] = p	;
	for(i=1;i<5;i++)
	{
#ifdef	TYPE_TERI
		p0  = findSplitter(s[i-1],'<')	;
		if(!p0)	{return 0;}
		*p0 = '\0'	;
		p0++		;
		*p0 = '\0'	;
		p0++		;
		s[i] = p0	;
#else
		p0  = findSplitter(s[i-1],',')	;
		if(!p0)	{return 0;}
		*p0 = '\0'	;
		p0++		;
		s[i] = p0	;
#endif
	}
	return	1		;
}
int	dump_out16(char *d)
{
	unsigned char	*p = (unsigned char*)d	;
	printf("\n\n<!-- ")	;
	while(*p)
	{
		printf(",%02x",*p)	;
		p++	;
	}
	printf(" -->\n\n")	;
}
int	IsBusy2ch()
{
	if(tm_now->tm_hour < LIMIT_AM || LIMIT_PM <= tm_now->tm_hour)	return	1	;
	return	0	;
}
/****************************************************************/
/*	えらー							*/
/****************************************************************/
char *LastChar(char *src,char *c)
{
	char	*p			;
	if(!*src)	return(src)	;
	p = strstr(src,c)		;
	if(!p)	return(src)		;
	return	LastChar(p+1,c)		;
/*
	return p+1	;
*/
}
/****************************************************************/
/*	HTML HEADER						*/
/****************************************************************/
int	html_head(char *title,int line)
{
printf("<HTML>")	;
printf("<HEAD>")	;
printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">")	;

printf("<TITLE>%s </TITLE>",title)	;

if(strcmp(zz_im,"true"))	/* no imode	*/
{
printf("<SCRIPT LANGUAGE=JavaScript>")	;
printf("<!--\n")	;
printf("N=g(\"NAME\");")	;
printf("M=g(\"MAIL\");")	;
printf("function g(key,tmp1,tmp2,xx1,xx2,xx3){")	;
printf("tmp1=\" \"+document.cookie+\";\";")	;
printf("xx1=xx2=0;")	;
printf("len=tmp1.length;")	;
printf("while(xx1<len){")	;
printf("xx2=tmp1.indexOf(\";\",xx1);")	;
printf("tmp2=tmp1.substring(xx1+1,xx2);")	;
printf("xx3=tmp2.indexOf(\"=\");")	;
printf("if(tmp2.substring(0,xx3)==key){")	;
printf("return(unescape(tmp2.substring(xx3+1,xx2-xx1-1)));")	;
printf("}")	;
printf("xx1=xx2+1;")	;
printf("}return(\"\");")	;
printf("}\n")	;
printf("// -->")	;
printf("</SCRIPT>")	;
}
printf("</HEAD>")	;

printf("<BODY TEXT=black BGCOLOR=#EFEFEF link=blue alink=red vlink=#660099>")	;

if(strcmp(zz_im,"true"))	/* no imode	*/
{
printf("<A HREF=\"/%s/index2.html\">■掲示板に戻る■</A>",zz_bs)			;
printf(" <A HREF=\"%s?bbs=%s&key=%s\">レスを全部読む</A>",CGINAME,zz_bs,zz_ky)	;
printf(" <A HREF=\"%s?bbs=%s&key=%s&ls=100\">最新レス100</A>",CGINAME,zz_bs,zz_ky)	;
}
else
{
printf("<A HREF=\"/%s/i/\">■掲示板に戻る■</A>",zz_bs)			;
printf(" <A HREF=\"%s?bbs=%s&key=%s&st=1&st=%d&imode=true\">レスを最初から読む</A>",CGINAME,zz_bs,zz_ky,RES_IMODE)	;
printf(" <A HREF=\"%s?bbs=%s&key=%s&ls=%d&imode=true\">最新レス%d</A>",CGINAME,zz_bs,zz_ky,RES_IMODE,RES_IMODE)	;
}


if(line > RES_RED)
{
printf("<P><TABLE><TR><TD BGCOLOR=RED>\n")	;
printf("<FONT COLOR=WHITE><BR><BR>レス数が %d を超えています。残念ながら全部は表\示しません。<BR><BR></FONT>\n",RES_RED,RES_RED)	;
printf("</TD></TR></TABLE>\n")	;
}
else if(line > RES_REDZONE)
{
printf("<P><TABLE><TR><TD BGCOLOR=RED>\n")	;
printf("<FONT COLOR=WHITE>レス数が %d を超えています。%dを超えると表\示できなくなるよ。</FONT>\n",RES_REDZONE,RES_RED)	;
printf("</TD></TR></TABLE>\n")	;
}
else if(line > RES_YELLOW)
{
printf("<P><TABLE><TR><TD BGCOLOR=YELLOW>\n")	;
printf("レス数が %d を超えています。%dを超えると表\示できなくなるよ。\n",RES_YELLOW,RES_RED)	;
printf("</TD></TR></TABLE>\n")	;
}

printf("<P><FONT SIZE=+1 COLOR=red>%s </FONT>",title)	;
}
/****************************************************************/
/*	HTML FOOTER						*/
/****************************************************************/
int	html_foot(int line)
{
	if(!strcmp(zz_im,"true"))	return	html_foot_im()	;
if(line <= RES_RED)
{
printf("<form method=POST action=\"bbs.cgi\">")	;
/**/
printf("<input type=submit value=\"書き込む\" name=submit> 名前: ")	;

printf("<SCRIPT Language=JavaScript>")	;
printf("<!--\n")	;
printf("document.write(\"<INPUT TYPE=text NAME=FROM SIZE=19 VALUE=\",N,\"> E-mail<font size=1> (省略可) </font>: <INPUT TYPE=text NAME=mail SIZE=19 VALUE=\",M,\">\");\n")	;
printf("// -->")	;
printf("</SCRIPT>")	;

printf("<NOSCRIPT>")	;
printf("<INPUT TYPE=text NAME=FROM SIZE=19>")	;
printf(" E-mail<font size=1> (省略可) </font>: ")	;
printf("<INPUT TYPE=text NAME=mail SIZE=19>")	;
printf("</NOSCRIPT>\n")	;

printf("<BR><textarea rows=5 cols=70 wrap=OFF name=MESSAGE></textarea>")	;
printf("<input type=hidden name=bbs value=%s>",zz_bs)	;
printf("<input type=hidden name=key value=%s>",zz_ky)	;
printf("<input type=hidden name=time value=%ld>",currentTime)	;
/**/
printf("</form>")	;
}

/*html_banner()		;*/

printf("</DL><P>%s</BODY></HTML>\n",CGIVER)	;
}
/****************************************************************/
/*	HTML FOOTER						*/
/****************************************************************/
int	html_foot_im(void)
{
printf("<FORM METHOD=POST ACTION=\"./bbs.cgi\">\n");
printf("<INPUT TYPE=submit VALUE=\"かきこむ\" name=\"submit\"> ");
printf("NAME:<INPUT TYPE=text NAME=FROM SIZE=20 VALUE=\"\">");
printf("MAIL:<INPUT TYPE=text NAME=mail SIZE=20 VALUE=\"\">");
printf("<br>");
printf("<INPUT TYPE=hidden name=time VALUE=%ld>\n",currentTime);
printf("<INPUT TYPE=hidden name=bbs VALUE=%s>\n",zz_bs);
printf("<INPUT TYPE=hidden name=key VALUE=%s>\n",zz_ky);
printf("<TEXTAREA ROWS=5 COLS=60 wrap=off NAME=MESSAGE></TEXTAREA>\n");
printf("</FORM><br>\n")	;

/*html_banner()		;*/

printf("<P>%s</BODY></HTML>\n",CGIVER)	;
}
/****************************************************************/
/*	Replace							*/
/****************************************************************/
char	*doReplace(char *des,char *str0,char *str1)
{
	char	*p,*ret	= NULL	;
	char	t[SIZE_BUF]	;
	strcpy(t,des)		;
	p = strstr(t,str0)	;
	if(!p)	return	ret	;
	*p = '\0'		;
	strcpy(des,t)		;
	strcat(des,str1)	;
	ret = des + strlen(des)	;
	strcat(des,p+strlen(str0))	;
	return	ret		;
}
int	someReplace(char *src,char *des,char *str0,char *str1)
{
	char	*last 			;
	strcpy(des,src)			;

	last = des			;
	while(last)
	{
		last = doReplace(last,str0,str1)	;
	}
	return	1			;
}
int	hrefStop(char x)
{
	if('A' <= x && x <= 'Z')	return	0	;
	if('a' <= x && x <= 'z')	return	0	;
	if('0' <= x && x <= '9')	return	0	;
	if(x == '#')	return	0	;
	if(x == '/')	return	0	;
	if(x == '~')	return	0	;
	if(x == '_')	return	0	;
	if(x == '.')	return	0	;
	if(x == ',')	return	0	;
	if(x == '$')	return	0	;
	if(x == '%')	return	0	;
	if(x == '&')	return	0	;
	if(x == '@')	return	0	;
	if(x == '?')	return	0	;
	if(x == '=')	return	0	;
	if(x == '-')	return	0	;
	if(x == '+')	return	0	;
	if(x == '*')	return	0	;
	if(x == ';')	return	0	;
	if(x == ':')	return	0	;
	if(x == '!')	return	0	;
	if(x == '^')	return	0	;
	if(x == '`')	return	0	;
	if(x == '|')	return	0	;
	if(x == '[')	return	0	;
	if(x == ']')	return	0	;
	if(x == '{')	return	0	;
	if(x == '}')	return	0	;
	if(x == '\\')	return	0	;
	return	1	;
}
int	cutWordOff(char *src,char *word)
{
	char	*p = strstr(src,word)	;
	if(!p)	return	0		;
	*p = '\0'			;
	return	1			;
}
int	ExistHlinkX(char *tgt,char *src,char *url,char *hrefStr)
{
	char	*p			;
	char	*u			;
	p = strstr(src,tgt)		;
	if(!p)	return	0		;	/*NASHI*/
	for(u=url;*p;p++)
	{
		if(hrefStop(*p))	break	;
		*u = *p			;
		u++			;
	}
	*u = '\0'			;
	/*-- &quot; 等の削除 --*/
	cutWordOff(url,"&quot;")	;
/*	cutWordOff(url,";")		;*/
	/*---------------------*/
	sprintf(hrefStr,"<A HREF=\"%.1024s\" TARGET=\"_blank\">%.1024s</A>",url,url)	;
	//sprintf(hrefStr,"<A HREF=\"%s\" TARGET=\"_blank\">%s</A>",url,url)	;
	return	1			;	/*ARI*/
}
int	ExistHlink(char *src,char *h0,char *h1)
{
	if(ExistHlinkX("http://",src,h0,h1))	return	1;
	if(ExistHlinkX("ftp://",src,h0,h1))	return	1;
	return	0			;
}
int	hlinkReplace(char *src)
{
	char	*last = src		;
	char	hlink0[SIZE_BUF]	;
	char	hlink1[SIZE_BUF]	;

	while(last)
	{
		if(!ExistHlink(last,hlink0,hlink1))	break	;
		last = doReplace(last,hlink0,hlink1)		;
	}
	return	1			;
}


/****************************************************************/
/*	END OF THIS FILE					*/
/****************************************************************/